﻿// Inner Fire 游戏引擎库
// AnimatorEvents - 动画事件
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于管理动画事件。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-14

#include "animator_events.h"
#include "animation_clip.h"

namespace ifire::game {

AnimatorEvents::AnimatorEvents(Animator* owner) : animator_(owner) {}

AnimatorEvent* AnimatorEvents::PopEvent() {
  // 判断是否为空
  if (events_.empty()) return nullptr;

  // 遍历项目，寻找没有处理的事件
  for (auto& i : events_) {
    if (!i.is_processed) {
      return &i;
    }
  }

  return nullptr;
}

void AnimatorEvents::AddEvent(const AnimationEvent* event) {
  // 如果已经存在事件没有处理，不重复增加
  if (!ContainsEvent(event)) {
    events_.emplace_back(event);
  }
}

// 从一个Clip中判断要触发的事件
void AnimatorEvents::PickEvent(const AnimationClip* clip, float tick) {
  if (!clip->HasEvent()) return;

  for (auto& i : clip->events) {
    // 当前时间大于项目时就触发
    if (tick > i.time) {
      AddEvent(&i);
    }
  }
}

bool AnimatorEvents::ContainsEvent(const AnimationEvent* target) const {
  if (target == nullptr) return false; // 防御性编程

  return eastl::any_of(
      events_.begin(), events_.end(), [target](const AnimatorEvent& e) {
        return e.event == target; // 直接指针比对
      });
}

void AnimatorEvents::Clear() { events_.clear(); }

ikit::sstr AnimatorEvent::GetName() const { return event->name; }

} // namespace ifire::game